/*
 * DatosCambiaDuenio.cpp
 *
 *  Created on: 31/01/2010
 *      Author: San Martín, Matías I.
 */

#include "DatosCambiaDuenio.h"

#include <sstream>

#include "../../../Framework/Common/File.h"

namespace aplicacion {

std::ostream &operator<<( std::ostream &stream, const DatosCambiaDuenio &obj )
{
  return stream << "DatosCambiaDuenio("<< obj.getTamanio() <<"):"
			  << obj._duenioNuevo << "|" << obj._duenioAnterior;
}

std::string DatosCambiaDuenio::toString() const
{
	std::stringstream stm;
	stm << *this;
	return stm.str();
}

DatosCambiaDuenio::DatosCambiaDuenio() {
	this->setTamanio(sizeof(t_identificadorFuente) * 2);
}

DatosCambiaDuenio::~DatosCambiaDuenio() {
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t DatosCambiaDuenio::save (int fd) const
{
	size_t guardar = 0;

	//se guardan los datos especificos de esta clase
	t_identificadorFuente duenioNuevo;
	t_identificadorFuente duenioAnterior;
	_duenioNuevo.saveToMensaje(duenioNuevo);
	_duenioAnterior.saveToMensaje(duenioAnterior);

	guardar += sizeof(duenioNuevo);
	File::writeAll(fd,&duenioNuevo,sizeof(duenioNuevo));

	guardar += sizeof(duenioAnterior);
	File::writeAll(fd,&duenioAnterior,sizeof(duenioAnterior));

	return guardar;
}

/**
 * @throws IOExcepcion @see File#writeAll
 */
size_t DatosCambiaDuenio::load (int fd)
{
	size_t cargar = 0;

	//se cargan los datos especificos de esta clase
	t_identificadorFuente duenioNuevo;
	t_identificadorFuente duenioAnterior;

	cargar += sizeof(duenioNuevo);
	File::readAll(fd,&duenioNuevo,sizeof(duenioNuevo));

	cargar += sizeof(duenioAnterior);
	File::readAll(fd,&duenioAnterior,sizeof(duenioAnterior));

	_duenioNuevo.loadFromMensaje(duenioNuevo);
	_duenioAnterior.loadFromMensaje(duenioAnterior);

	this->setTamanio(cargar);
	return cargar;
}

/**
 * @see middleware::io::SerializableToArray#saveToArray(int)
 */
size_t DatosCambiaDuenio::saveToArray (uint8_t* arr) const {
	uint8_t* arr_original = arr;

	//se guardan los datos especificos de esta clase
	t_identificadorFuente duenioNuevo;
	t_identificadorFuente duenioAnterior;
	_duenioNuevo.saveToMensaje(duenioNuevo);
	_duenioAnterior.saveToMensaje(duenioAnterior);

	memcpy(arr, &duenioNuevo, sizeof(duenioNuevo));
	arr += sizeof(duenioNuevo);

	memcpy(arr, &duenioAnterior,sizeof(duenioAnterior));
	arr += sizeof(duenioAnterior);

	return arr - arr_original;
}

/**
 * @see middleware::io::SerializableToArray#loadFromArray(int)
 */
size_t DatosCambiaDuenio::loadFromArray (const uint8_t* arr) {
	const uint8_t* arr_original = arr;

	//se cargan los datos especificos de esta clase
	t_identificadorFuente duenioNuevo;
	t_identificadorFuente duenioAnterior;

	memcpy(&duenioNuevo, arr, sizeof(duenioNuevo));
	arr += sizeof(duenioNuevo);

	memcpy(&duenioAnterior, arr, sizeof(duenioAnterior));
	arr += sizeof(duenioAnterior);

	_duenioNuevo.loadFromMensaje(duenioNuevo);
	_duenioAnterior.loadFromMensaje(duenioAnterior);

	size_t cargar = arr - arr_original;
	this->setTamanio(cargar);

	return cargar;
}

} //namespace aplicacion
